#include "printf.h"

// 打印单个字节
void BytePrintf(unsigned char ch)
{
	//高电平忙则等待空闲
    while (HAL_GPIO_ReadPin(PIN_10D_GPIO_Port, PIN_10D_Pin) != GPIO_PIN_RESET);

    HAL_GPIO_WritePin(PIN_1D_GPIO_Port, PIN_1D_Pin, ch & 0x01);
    HAL_GPIO_WritePin(PIN_2D_GPIO_Port, PIN_2D_Pin, ch & 0x02);
    HAL_GPIO_WritePin(PIN_3D_GPIO_Port, PIN_3D_Pin, ch & 0x04);
    HAL_GPIO_WritePin(PIN_4D_GPIO_Port, PIN_4D_Pin, ch & 0x08);
    HAL_GPIO_WritePin(PIN_5D_GPIO_Port, PIN_5D_Pin, ch & 0x10);
    HAL_GPIO_WritePin(PIN_6D_GPIO_Port, PIN_6D_Pin, ch & 0x20);
    HAL_GPIO_WritePin(PIN_7D_GPIO_Port, PIN_7D_Pin, ch & 0x40);
    HAL_GPIO_WritePin(PIN_8D_GPIO_Port, PIN_8D_Pin, ch & 0x80);

    HAL_GPIO_WritePin(PIN_9D_GPIO_Port, PIN_9D_Pin, GPIO_PIN_RESET);
    HAL_Delay(5);
    HAL_GPIO_WritePin(PIN_9D_GPIO_Port, PIN_9D_Pin, GPIO_PIN_SET);
    HAL_Delay(5);
}

// 手册上的中文打印指令
void CmdPrintf()
{
	BytePrintf(0x1C);
	BytePrintf(0x26);
}

// 打印中文字符串
void ChinesePrintf(unsigned char *putch)
{
    unsigned char i;
    // 例程中文打印指令
	BytePrintf(0x1B);
	BytePrintf(0x38);
	BytePrintf(0x00);
	HAL_Delay(5);
    for (i = 0; *(putch + i) != '\0'; i++) {
    	BytePrintf(*(putch + i));
    }
}

// 打印字符串
void StringPrintf(unsigned char *putch)
{
    unsigned char i;

    for (i = 0; *(putch + i) != '\0'; i++) {
    	BytePrintf(*(putch + i));
    }
}

// 辅助函数：格式化并打印参数
void PrintGaugeParameter(const char* label, uint16_t value)
{
    unsigned char buffer[50]; // 足够存储"标签：数值\r\n"这样的格式

    // 格式化字符串：标签+数值+换行符
    snprintf((char*)buffer, sizeof(buffer), "%s：%u\r\n", label, value);

    // 打印中文字符串标签
    ChinesePrintf(buffer);
}

// 打印实验数据（序号和对应值），最多显示50个
void PrintExperimentData(void)
{
    // 获取需要打印的数据总数，打印50个为上限
    int printCount = screen_set_param_t.num_gauge_param;
    if (printCount > 50) {
    	printCount = 50;
    }

    // 顺序打印每一次的序号和数据（从第一次到第printCount次）
    // 由于数据是倒序保存的，第一次实验数据在g_RawDataBuf[validCount-1]
    for(int i = 0; i < printCount; i++) {
        // 计算当前数据在缓冲区中的索引（倒序存储）
    	int bufIndex = printCount - i;
    	if(bufIndex < 0){
        	bufIndex = 0; // 防止数组越界
        }
        char dataStr[50];
        sprintf(dataStr, "第%d次: %f mm\r\n", bufIndex, g_RawDataBuf[i]*0.0001);
        ChinesePrintf(dataStr);
    }
    ChinesePrintf((unsigned char *)"\r\n");  // 打印空行分隔数据和统计值
}

void PrintAllGaugeParameters(void)
{
    // 先逐次打印实验数据
    PrintExperimentData();
    // 计算各参数（加上溢出值并转换为mm单位）
    float max_val = screen_set_param_t.max_gauge_param * 0.0001f;
    float min_val = screen_set_param_t.min_gauge_param * 0.0001f;
    float avg_val = screen_set_param_t.mean_gauge_param * 0.0001f;
    float std_val = screen_set_param_t.std_gauge_param * 0.0001f;
    // 构建包含所有参数的字符串
    unsigned char allParams[256];  // 足够容纳所有参数的缓冲区
    // 定义独立的格式字符串变量（彻底避免参数顺序错误）
    const char *format_str =
    		"最大值：%f mm\r\n"
    		"最小值：%f mm\r\n"
    		"平均值：%f mm\r\n"
    		"标准差：%f mm\r\n";
    // 正确调用sprintf(无缓冲区大小参数)
    sprintf((char*)allParams,
    		format_str,
            max_val, min_val, avg_val, std_val);
    // 控制台输出验证
    printf("打印内容:\r\n%s", allParams);
    // 一次性发送所有参数，实现连续打印
    ChinesePrintf(allParams);
    // 打印头
    ChinesePrintf((unsigned char *)"实验员：\r\n材料长度：\r\n材料编号：\r\n实验环境：\r\n执行标准：\r\n----------\r\n广州首诺科学仪器有限公司\r\nSN-CH2 测厚仪\r\n\r\n\r\n\r\n\r\n");
}
